<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
   
      <title>3.8. Listas de datos sencillas</title>
      <meta name="generator" content="DocBook XSL-NS Stylesheets V1.75.2">
      <link rel="home" href="indice.html" title="Manual Usuario gvHidra">
      <link rel="up" href="ch03.html" title="Cap&iacute;tulo 3. Elementos b&aacute;sicos">
      <link rel="prev" href="ch03s07.html" title="3.7. Tratamiento de tipos de datos">
      <link rel="next" href="ch03s09.html" title="3.9. Mensajes y Errores">
   </head>
   <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
      <div class="navheader">
         <table width="100%" summary="Navigation header">
            <tr>
               <th colspan="3" align="center">3.8. Listas de datos sencillas</th>
            </tr>
            <tr>
               <td width="20%" align="left"><a accesskey="p" href="ch03s07.html">Anterior</a>&nbsp;
               </td>
               <th width="60%" align="center">Cap&iacute;tulo 3. Elementos b&aacute;sicos</th>
               <td width="20%" align="right">&nbsp;<a accesskey="n" href="ch03s09.html">Siguiente</a></td>
            </tr>
         </table>
         <hr>
      </div>
      <div class="section" title="3.8. Listas de datos sencillas">
         <div class="titlepage">
            <div>
               <div>
                  <h2 class="title" style="clear: both"><a name="d4e2921"></a>3.8. Listas de datos sencillas
                  </h2>
               </div>
            </div>
         </div>
             
         
             
         <div class="section" title="3.8.1. Listas">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e2923"></a>3.8.1. Listas
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>Las listas de opciones son de gran ayuda para los formularios de
               las aplicaciones, nos podemos encontrar listas desplegables, listas de
                     tipo radiobutton o listas con checkbox. Vamos a ver como es el uso de
                     estos elementos en gvHidra.
            </p>
            
                  
            <p>Nos podemos encontrar con listas est&aacute;ticas o listas din&aacute;micas,
                     b&aacute;sicamente la diferencia se encuentra en el origen de datos que las
                     rellenar&aacute;n. Su implementaci&oacute;n es bastante similar aunque con algunas
                     diferencias. Vamos a describir lo que tienen en com&uacute;n los dos tipos de
                     listas.
            </p>
            
                  
            <p>Empezaremos viendo lo m&aacute;s sencillo, que es incluir una lista en la
                     plantilla (tpl). El plugin a utilizar es el <span class="bold"><strong>CWLista</strong></span>, vamos a hacer hincapi&eacute; en el par&aacute;metro
                     es "<span class="emphasis"><em>datos</em></span>", el resto se puede ver su definici&oacute;n y
                     uso en el Ap&eacute;ndice Documentaci&oacute;n de Plugins. En el par&aacute;metro datos nos
                     vendr&aacute;n los datos que compondr&aacute;n la lista en cuesti&oacute;n, la variable
                     asignada siempre deber&aacute; tener la misma estructura, la que vemos en el
                     ejemplo, siendo la palabra "defaultData_" reservada.
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">{CWLista nombre="codigoProvincia" textoAsociado="Provincia" editable="true" dataType=$dataType_claseManejadora.codigoProvincia
 <span class="bold"><strong>datos=$defaultData_claseManejadora.codigoProvincia</strong></span>}</pre>
                     </div>
            
                  
            <p>Pasamos a la parte que le corresponde a la clase manejadora del
                     panel. En ella debemos definir la lista mediante la clase <span class="bold"><strong>gvHidraList</strong></span>, este m&eacute;todo define el tipo y
                     contenido de la lista, para ello se le pasan unos par&aacute;metros:
            </p>
            
                  
            <div class="orderedlist">
               <ol class="orderedlist" type="1">
                  <li class="listitem">
                               
                     <p><span class="emphasis"><em>Nombre del campo destino de la lista</em></span>
                                  (campo <span class="emphasis"><em>obligatorio</em></span>). Ser&aacute; el mismo nombre que
                                  le hayamos puesto en la tpl al plugin CWLista (p.ej.
                                  "codigoProvincia")
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="emphasis"><em>Cadena que identifica la fuente de datos</em></span>
                                  (campo <span class="emphasis"><em>opcional</em></span>). Este campo pasa a ser
                                  obligatorio en el caso de las listas din&aacute;micas.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="emphasis"><em>DSN de conexi&oacute;n</em></span> (campo
                                  <span class="emphasis"><em>opcional</em></span>). Permite incluir un DSN de conexi&oacute;n
                                  para indicar una conexi&oacute;n alternativa a la propia del panel. Si no
                                  se indica ninguna se coger&aacute; por defecto el DSN del panel. Por
                                  ejemplo, podemos tener un panel trabajando en PostgreSQKL y que un
                                  campo tenga una lista desplegable que lea los datos en MySQL.
                     </p>
                             
                  </li>
               </ol>
            </div>
            
                  
            <p>A partir de la clase <span class="bold"><strong>gvHidraList()</strong></span> podemos utilizar los siguientes
                     m&eacute;todos para acabar de perfilar la lista:
            </p>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>addOption($valor,
                                        $descripcion)</strong></span>: Nos permite a&ntilde;adir opciones a la
                                  lista.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setSelected($valor)</strong></span>: Con este
                                  m&eacute;todo le indicaremos qu&eacute; opci&oacute;n aparecer&aacute; seleccionada por
                                  defecto.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setMultiple($multiple)</strong></span>:
                                  Pas&aacute;ndole un par&aacute;metro booleano (true/false) indicaremos si es o no
                                  una lista m&uacute;ltiple.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setSize($size)</strong></span>: Indicaremos
                                  el n&uacute;mero de elementos visibles cuando estamos en una lista que es
                                  m&uacute;ltiple. Por defecto tendr&aacute; un size=5.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setDependence($listasCamposTpl,
                                        $listasCamposBD,$tipoDependencia=0)</strong></span>: M&eacute;todo que permite
                                  asigar dependencia en una lista, es decir, si tenemos una lista
                                  cuyos valores dependen del valor de otros campos, necesitamos
                                  indicarlo con este m&eacute;todo.
                     </p>
                     
                               
                     <div class="itemizedlist">
                        <ul class="itemizedlist" type="circle">
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>$listasCamposTpl</em></span>: Ser&aacute; un array que
                                               contiene la lista de campos de la tpl de los cuales depende la
                                               lista.Array que, indexado en el mismo orden que el anterior,
                                               realiza la correspondencia de los campos del array anterior con
                                               los de la Base de Datos.
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>$listaCamposBD</em></span>: Ser&aacute; un array que,
                                               indexado en el mismo orden que el anterior, realiza la
                                               correspondencia de los campos de la tpl con los de la base de
                                               datos.
                              </p>
                                          
                           </li>
                           <li class="listitem">
                                            
                              <p><span class="emphasis"><em>$tipoDependencia</em></span>: Un entero con el
                                               que le indicaremos si es una dependencia fuerte-&gt;0 o
                                               d&eacute;bil-&gt;1 (si no tiene valor el campo dependiente lo
                                               ignora).
                              </p>
                                          
                           </li>
                        </ul>
                     </div>
                     
                               
                     <p>Nota: No se pueden crear listas dependientes con clausulas
                                  group by, ya que gvHidra internamente modifica en cada caso el valor
                                  de la where y en estos casos produce un error. De momento se pueden
                                  resolver usando una subconsulta con el group by en el from.
                     </p>
                     
                               
                     <div class="informalexample">
                                    <pre class="programlisting">$listaProvincias = new gvHidraList('codigoProvincia','PROVINCIAS');
$this-&gt;addList($listaProvincias);
$listaMunicipios = new gvHidraList('codigoMunicipio','MUNICIPIOS');
$listaMunicipios-&gt;<span class="bold"><strong>setDependence</strong></span>(array('codigoProvincia'),array('tcom_municipios.cpro'));
$this-&gt;addList($listaMunicipios);</pre>
                                  </div>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setRadio($radio)</strong></span>: Pas&aacute;ndole
                                  un par&aacute;metro booleano a true tendremos una lista de
                                  radiobuttons.
                     </p>
                             
                  </li>
               </ul>
            </div>
            
                  
            <p>Una vez hemos definido los datos que compondr&aacute;n la lista y c&oacute;mo la
                     queremos, tenemos que a&ntilde;adir la lista al panel, para ello utilizamos el
                     m&eacute;todo <span class="bold"><strong>addList()</strong></span> del panel.
            </p>
            
                  
            <div class="informalexample">
                       <pre class="programlisting">$listaProvincias = new gvHidraList('codigoProvincia','PROVINCIAS');
$this-&gt;addList($listaProvincias);</pre>
                     </div>
            
                  
            <div class="section" title="3.8.1.1. Listas est&aacute;ticas">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2987"></a>3.8.1.1. Listas est&aacute;ticas
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Como su propio nombre indica, el origen de datos de estas listas
                          vendr&aacute; dado por un conjunto de valores indicados de forma
                          est&aacute;tica.
               </p>
               
                       
               <p>Por lo tanto tendremos que definir la lista &uacute;nicamente en el
                          constructor de la clase manejadora.
               </p>
               
                       
               <p>Primero crearemos la lista haciendo uso de la clase <span class="bold"><strong>gvHidraList()</strong></span>, a la que se le pasa por
                          par&aacute;metro el nombre del campo que le hemos dado en la tpl. Ahora ya
                          podemos ir a&ntilde;adiendo las opciones que necesitamos, lo haremos con el
                          m&eacute;todo <span class="bold"><strong>addOption()</strong></span>, nos permitir&aacute;
                          a&ntilde;adir tantas opciones como se necesiten.
               </p>
               
                       
               <p>A continuaci&oacute;n vemos un ejemplo para que s&oacute;lo aparezcan las
                          provincias pertenecientes a la Comunidad Valenciana:
               </p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$listaProvincias = new gvHidraList('codigoProvincia');
$listaProvincias-&gt;addOption('03','ALICANTE');
$listaProvincias-&gt;addOption('12','CASTELLON');
$listaProvincias-&gt;addOption('46','VALENCIA');
$listaProvincias-&gt;setSelected('12');
$this-&gt;addList($listaProvincias);</pre>
                          </div>
                     
            </div>
            
                  
            <div class="section" title="3.8.1.2. Listas din&aacute;micas">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e2997"></a>3.8.1.2. Listas din&aacute;micas
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>En este caso, el conjunto de valores posibles se obtienen a
                          partir de una fuente de datos, ya sea de una consulta a base de datos,
                          una clase...
               </p>
               
                       
               <p>Tal y como se ha indicado al principio, el segundo par&aacute;metro
                          indica la fuente que se va a utilizar para obtener el contenido. Estas
                          fuentes se pueden definir a nivel general de gvHIDRA (consultas o
                          tablas comunes) o a nivel particular de cada aplicaci&oacute;n, teniendo en
                          cuenta que prevalecen las definidas en la aplicaci&oacute;n sobre las
                          generales del framework, si se han definido con el mismo
                          nombre.
               </p>
               
                       
               <p>Las definiciones de las listas din&aacute;micas deben ser cargadas al
                          arrancar la aplicaci&oacute;n, por ello se deben cargar en el constructor del
                          objeto que maneja el panel principal de la aplicaci&oacute;n, es decir, en la
                          clase <span class="bold"><strong>AppMainWindow.php</strong></span>.
               </p>
               
                       
               <p>Vamos a ver como incluir la fuente de datos, debemos hacer uso
                          del objeto de configuraci&oacute;n de gvHidra y del m&eacute;todo apropiado seg&uacute;n la
                          fuente que carguemos, que pueden ser de dos tipos: fuentes de datos
                          SQL o clases.
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>List_DBSource</strong></span></p>
                        
                                    
                        <p>Esta ha sido la fuente de datos habitual para las listas en
                                       gvHIDRA. B&aacute;sicamente consiste en cargar directamente una query que
                                       gvHidra se encargar&aacute; de parametrizar (a&ntilde;adir filtros a la where)
                                       para obtener el resultado esperado.
                        </p>
                        
                                    
                        <p>En este caso haremos uso del m&eacute;todo <span class="bold"><strong>setList_DBSource()</strong></span> donde definiremos la
                                       query correspondiente, teniendo en cuenta los siguientes
                                       puntos:
                        </p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>La consulta ha de seleccionar dos campos, uno se
                                                    corresponder&aacute;n con el valor que guardar&aacute; el campo (le
                                                    pondremos de alias 'valor' en la query), y el otro
                                                    corresponder&aacute; con la informaci&oacute;n que visualice la opci&oacute;n de la
                                                    lista en pantalla (este deber&aacute; tener el alias
                                                    'descripcion')
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>Por defecto la ordenaci&oacute;n es por el campo 'descripcion
                                                    asc', aunque podemos modificarla con la clausula ORDER
                                                    BY.
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <div class="informalexample">
                                         
                           
                                         <pre class="programlisting">class <span class="bold"><strong>AppMainWindow</strong></span> extends CustomMainWindow
{
  public function AppMainWindow()
  {
    ...
    $conf = ConfigFramework::getConfig();

    //Tipos
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('TIPOS',"select ctipo as \"valor\", dtipo as \"descripcion\" from tinv_tipos");

    //Subtipos
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('SUBTIPOS',"select cstipo as \"valor\", dstipo as \"descripcion\" from tinv_subtipos");

    //Estados
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('ESTADOS',"select cestado as \"valor\", destado as \"descripcion\" from tinv_estados");
    ...
  }
}</pre>
                                       </div>
                        
                                    
                        <p>En el ejemplo anterior vemos como con el m&eacute;todo <span class="bold"><strong>setList_DBSource()</strong></span> a&ntilde;adimos la definici&oacute;n
                                       de las fuentes de datos que se gastar&aacute;n en la aplicaci&oacute;n para
                                       cargar las listas. Este m&eacute;todo tiene dos par&aacute;metros, el primero es
                                       un identificador de la lista, este identificador debe coincidir
                                       con el identificador que se le da a la definici&oacute;n de la lista en
                                       la clase manejadora
                                       (gvHidraList('nombreCampo','<span class="emphasis"><em>TIPOS</em></span>');); y el
                                       segundo es la definici&oacute;n de la consulta SQL tal y como se ha
                                       indicado antes, con los alias correspondientes.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>List_ClassSource</strong></span></p>
                        
                                    
                        <p>Estas nos permiten definir como fuente de datos el resultado
                                       de un m&eacute;todo de una clase. Esta clase, debe implementar la
                                       interfaz <span class="bold"><strong>gvHidraList_Source</strong></span> para
                                       que el framework pueda interactuar con ella. Consiste en
                                       implementar el m&eacute;todo <span class="emphasis"><em>build</em></span> que ser&aacute; llamado
                                       por el framework para obtener el resultado de la consulta. Aqu&iacute;
                                       introducimos un ejemplo sencillo:
                        </p>
                        
                                    
                        <div class="informalexample">
                                         <pre class="programlisting">/**
 * Fuente de datos ejemplo
 * 
 * $Revision: 1.3.2.37 $
 */

class ejemploSource <span class="bold"><strong>implements gvHidraList_Source</strong></span> 
{
    public function __construct() 
    {

    }

    public function <span class="bold"><strong>build</strong></span>($dependence,$dependenceType) 
    {

       $resultado = array(
                    array('valor'=&gt;'01','descripcion'=&gt;'UNO'),
                    array('valor'=&gt;'02','descripcion'=&gt;'DOS'),
                    array('valor'=&gt;'03','descripcion'=&gt;'TRES'),
                );
       return $resultado;
    }
}</pre>
                                       </div>
                        
                                    
                        <p>De este ejemplo cabe destacar:</p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>La clase implementa la interfaz <span class="bold"><strong>gvHidraList_Source</strong></span>. Si no implementa
                                                    esta interfaz, no puede ser admitida como fuente de datos de
                                                    las listas.
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>El m&eacute;todo <span class="bold"><strong>build</strong></span>,
                                                    devuelve como resultado un <span class="emphasis"><em>array</em></span>. Este
                                                    array, puede ser array vacio o un array que contiene por cada
                                                    una de sus posiciones un array con dos &iacute;ndices v&aacute;lidos (valor
                                                    y descripci&oacute;n).
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <p>Al igual que en el caso de las fuentes de datos tipo
                                       List_DBSource(), para incluirlas debemos hacer uso del objeto de
                                       configuraci&oacute;n de gvHidra llamando al m&eacute;todo apropiado.En este
                                       caso, el m&eacute;todo a utilizar es setList_ClassSource. A continuaci&oacute;n
                                       mostramos algunos ejemplos de carga.
                        </p>
                        
                                    
                        <div class="informalexample">
                                         <pre class="programlisting">class AppMainWindow extends CustomMainWindow 
{
  public function AppMainWindow()
  {
    ...
    $conf = ConfigFramework::getConfig();

    $conf-&gt;<span class="bold"><strong>setList_ClassSource</strong></span>('EJEMPLO','ejemploSource');

    //Subtipos
    $conf-&gt;<span class="bold"><strong>setList_ClassSource</strong></span>('SUBTIPOS',"SubTipos");

    //Estados
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('ESTADOS',"EstadosSource");
    ...
  }
}</pre>
                                       </div>
                        
                                    
                        <p>En el ejemplo anterior vemos como con el m&eacute;todo <span class="bold"><strong>setList_ClassSource()</strong></span> a&ntilde;adimos la
                                       definici&oacute;n de las fuentes de datos que se gastar&aacute;n en la
                                       aplicaci&oacute;n para cargar las listas. Este m&eacute;todo tiene dos
                                       par&aacute;metros, el primero es un identificador de la lista, este
                                       identificador debe coincidir con el identificador que se le da a
                                       la definici&oacute;n de la lista en la clase manejadora
                                       (gvHidraList('nombreCampo','<span class="emphasis"><em>TIPOS</em></span>');); y el
                                       segundo es el nombre de la clase que actuar&aacute; como fuente.
                        </p>
                        
                                    
                        <p>Una vez conociendo como funcionan tanto las listas est&aacute;ticas
                                       como las din&aacute;micas, es muy com&uacute;n que se utilice una mezcla de
                                       ambas. Este uso nos ser&aacute; &uacute;til, por ejemplo, en el siguiente
                                       caso:
                        </p>
                        
                                    
                        <div class="informalexample">
                                         
                           
                                         <pre class="programlisting">$listaProvincias = new gvHidraList('codigoProvincia','PROVINCIAS');
$listaProvincias-&gt;addOption('00','Todas');
$listaProvincias-&gt;setSelected('00');
$this-&gt;addList($listaProvincias);</pre>
                                       </div>
                        
                                    
                        <p>En el ejemplo a&ntilde;adimos una opci&oacute;n que implica la selecci&oacute;n
                                       de todas las opciones, hay que tener en cuenta estos valores que
                                       se a&ntilde;aden de forma est&aacute;tica, porque al interactuar con la base de
                                       datos ese valor no existir&aacute;, por lo tanto habr&aacute; que a&ntilde;adir un
                                       control particular en la clase manejadora.
                        </p>
                        
                                    
                        <p>Otro ejemplo puede ser que el campo de la base de datos
                                       admita tambi&eacute;n nulos, as&iacute; que tendremos que a&ntilde;adir una opci&oacute;n de
                                       valor nulo y descripci&oacute;n en blanco, para darnos la posibilidad de
                                       no a&ntilde;adir ning&uacute;n valor:
                        </p>
                        
                                    
                        <div class="informalexample">
                                         
                           
                                         <pre class="programlisting">$listaProvincias-&gt;addOption('',' ');</pre>
                                       </div>
                                  
                     </li>
                  </ul>
               </div>
                     
            </div>
            
                  
            <div class="section" title="3.8.1.3. Listas dependientes">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e3060"></a>3.8.1.3. Listas dependientes
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Una vez que conocemos los dos tipos de listas que podemos tener,
                          hay que decir que podemos tener el caso de que el contenido de la
                          lista sea dependiente de otros campos. Para ello, en la definici&oacute;n de
                          las listas hay que indicar cual es la dependencia, lo haremos mediante
                          el m&eacute;todo <span class="bold"><strong>setDependence()</strong></span> de la clase
                          <span class="bold"><strong>gvHidraList</strong></span>.
               </p>
               
                       
               <p>Las definiciones de las listas din&aacute;micas deben ser cargadas al
                          arrancar la aplicaci&oacute;n, por ello se deben cargar en el constructor del
                          objeto que maneja el panel principal de la aplicaci&oacute;n, es decir, en la
                          clase <span class="bold"><strong>AppMainWindow.php</strong></span>.
               </p>
               
                       
               <p>Vamos a ver como incluir la fuente de datos, debemos hacer uso
                          del objeto de configuraci&oacute;n de gvHidra y del m&eacute;todo apropiado seg&uacute;n la
                          fuente que carguemos, que pueden ser de dos tipos: fuentes de datos
                          SQL o clases.
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>List_DBSource</strong></span></p>
                        
                                    
                        <p>Esta ha sido la fuente de datos habitual para las listas en
                                       gvHIDRA. B&aacute;sicamente consiste en cargar directamente una query que
                                       gvHidra se encargar&aacute; de parametrizar (a&ntilde;adir filtros a la where)
                                       para obtener el resultado esperado.
                        </p>
                        
                                    
                        <p>En este caso haremos uso del m&eacute;todo <span class="bold"><strong>setList_DBSource()</strong></span> donde definiremos la
                                       query correspondiente, teniendo en cuenta los siguientes
                                       puntos:
                        </p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>La consulta ha de seleccionar dos campos, uno se
                                                    corresponder&aacute;n con el valor que guardar&aacute; el campo (le
                                                    pondremos de alias 'valor' en la query), y el otro
                                                    corresponder&aacute; con la informaci&oacute;n que visualice la opci&oacute;n de la
                                                    lista en pantalla (este deber&aacute; tener el alias
                                                    'descripcion')
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>Por defecto la ordenaci&oacute;n es por el campo 'descripcion
                                                    asc', aunque podemos modificarla con la clausula ORDER
                                                    BY.
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <div class="informalexample">
                                         
                           
                                         <pre class="programlisting">class <span class="bold"><strong>AppMainWindow</strong></span> extends CustomMainWindow
{
  public function AppMainWindow()
  {
    ...
    $conf = ConfigFramework::getConfig();
    //Tipos
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('TIPOS',"select ctipo as \"valor\", dtipo as \"descripcion\" from tinv_tipos");

    //Subtipos
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('SUBTIPOS',"select cstipo as \"valor\", dstipo as \"descripcion\" from tinv_subtipos");

    //Estados
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('ESTADOS',"select cestado as \"valor\", destado as \"descripcion\" from tinv_estados");
    ...
  }
}</pre>
                                       </div>
                        
                                    
                        <p>En el ejemplo anterior vemos como con el m&eacute;todo <span class="bold"><strong>setList_DBSource()</strong></span> a&ntilde;adimos la definici&oacute;n
                                       de las fuentes de datos que se gastar&aacute;n en la aplicaci&oacute;n para
                                       cargar las listas. Este m&eacute;todo tiene dos par&aacute;metros, el primero es
                                       un identificador de la lista, este identificador debe coincidir
                                       con el identificador que se le da a la definici&oacute;n de la lista en
                                       la clase manejadora
                                       (gvHidraList('nombreCampo','<span class="emphasis"><em>TIPOS</em></span>');); y el
                                       segundo es la definici&oacute;n de la consulta SQL tal y como se ha
                                       indicado antes, con los alias correspondientes.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>List_ClassSource</strong></span></p>
                        
                                    
                        <p>Estas nos permiten definir como fuente de datos el resultado
                                       de un m&eacute;todo de una clase. Esta clase, debe implementar la
                                       interfaz <span class="bold"><strong>gvHidraList_Source</strong></span> para
                                       que el framework pueda interactuar con ella. Consiste en
                                       implementar el m&eacute;todo <span class="emphasis"><em>build</em></span> que ser&aacute; llamado
                                       por el framework para obtener el resultado de la consulta. Aqu&iacute;
                                       introducimos un ejemplo sencillo:
                        </p>
                        
                                    
                        <div class="informalexample">
                                         <pre class="programlisting">/**
 * Fuente de datos ejemplo
 * 
 * $Revision: 1.3.2.37 $
 */

class ejemploSource <span class="bold"><strong>implements gvHidraList_Source</strong></span> 
{

    public function __construct() 
    {

    }

    public function <span class="bold"><strong>build</strong></span>($dependence,$dependenceType) 
    {

       $resultado = array(
                    array('valor'=&gt;'01','descripcion'=&gt;'UNO'),
                    array('valor'=&gt;'02','descripcion'=&gt;'DOS'),
                    array('valor'=&gt;'03','descripcion'=&gt;'TRES'),
                );
       return $resultado;
    }//Metodo build
}</pre>
                                       </div>
                        
                                    
                        <p>De este ejemplo cabe destacar:</p>
                        
                                    
                        <div class="itemizedlist">
                           <ul class="itemizedlist" type="circle">
                              <li class="listitem">
                                                 
                                 <p>La clase implementa la interfaz <span class="bold"><strong>gvHidraList_Source</strong></span>. Si no implementa
                                                    esta interfaz, no puede ser admitida como fuente de datos de
                                                    las listas.
                                 </p>
                                               
                              </li>
                              <li class="listitem">
                                                 
                                 <p>El m&eacute;todo <span class="bold"><strong>build</strong></span>,
                                                    devuelve como resultado un <span class="emphasis"><em>array</em></span>. Este
                                                    array, puede ser array vacio o un array que contiene por cada
                                                    una de sus posiciones un array con dos &iacute;ndices v&aacute;lidos (valor
                                                    y descripci&oacute;n).
                                 </p>
                                               
                              </li>
                           </ul>
                        </div>
                        
                                    
                        <p>Al igual que en el caso de las fuentes de datos tipo
                                       List_DBSource(), para incluirlas debemos hacer uso del objeto de
                                       configuraci&oacute;n de gvHidra llamando al m&eacute;todo apropiado.En este
                                       caso, el m&eacute;todo a utilizar es setList_ClassSource. A continuaci&oacute;n
                                       mostramos algunos ejemplos de carga.
                        </p>
                        
                                    
                        <div class="informalexample">
                                         <pre class="programlisting">class AppMainWindow extends CustomMainWindow 
{
  public function AppMainWindow()
  {
    ...
    $conf = ConfigFramework::getConfig();

    $conf-&gt;<span class="bold"><strong>setList_ClassSource</strong></span>('EJEMPLO','ejemploSource');

    //Subtipos
    $conf-&gt;<span class="bold"><strong>setList_ClassSource</strong></span>('SUBTIPOS',"SubTipos");

    //Estados
    $conf-&gt;<span class="bold"><strong>setList_DBSource</strong></span>('ESTADOS',"EstadosSource");
    ...
  }
}</pre>
                                       </div>
                        
                                    
                        <p>En el ejemplo anterior vemos como con el m&eacute;todo <span class="bold"><strong>setList_ClassSource()</strong></span> a&ntilde;adimos la
                                       definici&oacute;n de las fuentes de datos que se gastar&aacute;n en la
                                       aplicaci&oacute;n para cargar las listas. Este m&eacute;todo tiene dos
                                       par&aacute;metros, el primero es un identificador de la lista, este
                                       identificador debe coincidir con el identificador que se le da a
                                       la definici&oacute;n de la lista en la clase manejadora
                                       (gvHidraList('nombreCampo','<span class="emphasis"><em>TIPOS</em></span>');); y el
                                       segundo es el nombre de la clase que actuar&aacute; como fuente.
                        </p>
                        
                                    
                        <p>Una vez conociendo como funcionan tanto las listas est&aacute;ticas
                                       como las din&aacute;micas, es muy com&uacute;n que se utilice una mezcla de
                                       ambas. Este uso nos ser&aacute; &uacute;til, por ejemplo, en el siguiente
                                       caso:
                        </p>
                        
                                    
                        <div class="informalexample">
                                         
                           
                                         <pre class="programlisting">$listaProvincias = new gvHidraList('codigoProvincia','PROVINCIAS');
$listaProvincias-&gt;addOption('00','Todas');
$listaProvincias-&gt;setSelected('00');
$this-&gt;addList($listaProvincias);</pre>
                                       </div>
                        
                                    
                        <p>En el ejemplo a&ntilde;adimos una opci&oacute;n que implica la selecci&oacute;n
                                       de todas las opciones, hay que tener en cuenta estos valores que
                                       se a&ntilde;aden de forma est&aacute;tica, porque al interactuar con la base de
                                       datos ese valor no existir&aacute;, por lo tanto habr&aacute; que a&ntilde;adir un
                                       control particular en la clase manejadora.
                        </p>
                        
                                    
                        <p>Otro ejemplo puede ser que el campo de la base de datos
                                       admita tambi&eacute;n nulos, as&iacute; que tendremos que a&ntilde;adir una opci&oacute;n de
                                       valor nulo y descripci&oacute;n en blanco, para darnos la posibilidad de
                                       no a&ntilde;adir ning&uacute;n valor:
                        </p>
                        
                                    
                        <div class="informalexample">
                                         
                           
                                         <pre class="programlisting">$listaProvincias-&gt;addOption('',' ');</pre>
                                       </div>
                                  
                     </li>
                  </ul>
               </div>
                     
            </div>
            
                  
            <div class="section" title="3.8.1.4. Uso en acciones">
               <div class="titlepage">
                  <div>
                     <div>
                        <h4 class="title"><a name="d4e3124"></a>3.8.1.4. Uso en acciones
                        </h4>
                     </div>
                  </div>
               </div>
                       
               
                       
               <p>Las listas tienen una serie de m&eacute;todos especiales que permiten
                          su manipulaci&oacute;n en las acciones. Para acceder a una lista desde una
                          acci&oacute;n de este tipo se debe hacer uso de los siguientes
                          m&eacute;todos:
               </p>
               
                       
               <div class="itemizedlist">
                  <ul class="itemizedlist" type="disc">
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>getLista</strong></span>:obtenemos la lista
                                       con la que queremos trabajar.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>clean</strong></span>: limpiamos los
                                       valores dej&aacute;ndola vacia.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>setLista</strong></span>: fijamos una
                                       lista.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>setSelected</strong></span>: marcamos un
                                       valor como seleccionado.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>getDescription</strong></span>: devuelve la
                                       descripci&oacute;n del valor seleccionado.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>getSelected</strong></span>: devuelve el
                                       valor seleccionado.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>toArray</strong></span>: obtenemos una
                                       lista en formato array.
                        </p>
                                  
                     </li>
                     <li class="listitem">
                                    
                        <p><span class="bold"><strong>arrayToObject</strong></span>: cargamos un
                                       objeto lista con un array.
                        </p>
                                  
                     </li>
                  </ul>
               </div>
               
                       
               <p>A continuaci&oacute;n mostramos un ejemplo de uso:</p>
               
                       
               <div class="informalexample">
                            
                  
                            <pre class="programlisting">$lcuentaFe = $objDatos-&gt;getLista('cuenta_fe');
$lcuentaFe-&gt;clean();

$lcuentaFe-&gt;addOption('','');

if (count($datos)&gt;0) {

	foreach($datos as $datos_lista) {
	 &nbsp;&nbsp;&nbsp;//valor, descripcion
&nbsp;&nbsp;&nbsp;&nbsp;	$lcuentaFe-&gt;addOption($datos_lista['valor'],$datos_lista['descripcion']);
&nbsp;&nbsp;&nbsp;&nbsp;}
}
$lcuentaFe-&gt;setSelected('');

$objDatos-&gt;setLista('cuenta_fe',$lcuentaFe);
...</pre>
                          </div>
                     
            </div>
                
         </div>
         
             
         <div class="section" title="3.8.2. Checkbox">
            <div class="titlepage">
               <div>
                  <div>
                     <h3 class="title"><a name="d4e3155"></a>3.8.2. Checkbox
                     </h3>
                  </div>
               </div>
            </div>
                  
            
                  
            <p>El elemento checkbox podemos emplearlo tambi&eacute;n para una lista de
                     valores, nos permitir&aacute; elegir m&aacute;s de una opci&oacute;n ya que no ser&aacute;n
                     excluyentes. Para definir el checkbox hay que hacer uso de la clase
                     <span class="bold"><strong>gvHidraCheckBox</strong></span> y de sus metodos, que
                     son:
            </p>
            
                  
            <div class="itemizedlist">
               <ul class="itemizedlist" type="disc">
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setValueChecked($value)</strong></span>: Fija
                                  el valor que se quiere tener cuando el check est&aacute; marcado.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>getValueChecked()</strong></span>: Devuelve
                                  el valor que tiene el check cuando est&aacute; marcado.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setValueUnchecked($value)</strong></span>:
                                  Fija el valor que se quiere tener cuando el check est&aacute;
                                  desmarcado.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>getValueUnchecked()</strong></span>: Devuelve
                                  el valor que tiene el check cuando est&aacute; desmarcado.
                     </p>
                             
                  </li>
                  <li class="listitem">
                               
                     <p><span class="bold"><strong>setChecked($boolean)</strong></span>: Indicar
                                  si el checkbox aparece marcado o no por defecto.
                     </p>
                             
                  </li>
               </ul>
            </div>
            
                  
            <p>De este modo en la clase manejadora tendremos que crear el
                     checkbox y definir las propiedades:
            </p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">//Creamos checkbox y lo asociamos a la clase manejadora
$filCoche = new gvHidraCheckBox('filCoche');
$filCoche-&gt;setValueChecked('t');
$filCoche-&gt;setValueUnchecked('f');
$this-&gt;addCheckBox($filCoche);</pre>
                     </div>
            
                  
            <p>En la tpl definiremos el checkbox de la siguiente forma:</p>
            
                  
            <div class="informalexample">
                       
               
                       <pre class="programlisting">{CWCheckBox nombre="filCoche" editable="true" textoAsociado="Coche" dataType=$dataType_claseManejadora.filCoche 
valor=$defaultData_claseManejadora.filCoche}</pre>
                     </div>
            
                  
            <p>Es importante a&ntilde;adir el par&aacute;metro dataType que es el que asociar&aacute;
                     la definici&oacute;n dada en la clase manejadora con el plugin.
            </p>
                
         </div>
           
      </div>
      <div class="navfooter">
         <hr>
         <table width="100%" summary="Navigation footer">
            <tr>
               <td width="40%" align="left"><a accesskey="p" href="ch03s07.html">Anterior</a>&nbsp;
               </td>
               <td width="20%" align="center"><a accesskey="u" href="ch03.html">Subir</a></td>
               <td width="40%" align="right">&nbsp;<a accesskey="n" href="ch03s09.html">Siguiente</a></td>
            </tr>
            <tr>
               <td width="40%" align="left" valign="top">3.7. Tratamiento de tipos de datos&nbsp;</td>
               <td width="20%" align="center"><a accesskey="h" href="indice.html">Inicio</a></td>
               <td width="40%" align="right" valign="top">&nbsp;3.9. Mensajes y Errores</td>
            </tr>
         </table>
      </div>
   </body>
</html>